package util.concurrent;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ReentrantLock 默认是->
 * 非公平 所有处于就绪状态的线程，在独占锁被当前持有锁的线程释放后，都有机会得到
 * 可重入 能够被同一个线程，反复多次获取的锁。sychronized关键字获取的锁，就是一个可重入锁。
 * 互斥锁(独占)锁   锁只能被一个线程拿到  sychronized 关键字获取的锁，就是一个独占锁。
 * <p>
 * <p>
 * <p>
 * <p>
 * Condition
 * Condition.await() == Object.wait()
 * Condition.signal() == Object.notify()
 * Condition.signalAll() == Object.notifyAll()
 */

/**
 * synchronized
 * <p>
 * 只要线程运行的代码超出了synchronized语句块范围, 锁就会被释放.
 * 而Lock机制必须显式的调用Lock对象的unlock()方法才能释放锁,
 * 这为获取锁和释放锁不出现在同一个块结构中, 以及以更自由的顺序释放锁提供了可能.
 */
public class ReentrantLock_ {
    private static ReentrantLock lock = new ReentrantLock();
    static String a = "";


    public static void test1() {
        lock.tryLock();    //如果已经被lock，则立即返回false不会等待，达到忽略操作的效果 tryLock()仍然可以打开公平性去插队抢占
        lock.lock();       //如果被其它资源锁定，会在此等待锁释放，达到暂停的效果
        try {
            lock.tryLock(5, TimeUnit.SECONDS);  //如果已经被lock，尝试等待5s，看是否可以获得锁，如果5s后仍然无法获得锁则返回false继续执行
        } catch (InterruptedException e) {
            e.printStackTrace();  // //当前线程被中断时(interrupt)，会抛InterruptedException
        }

        try {
            lock.lockInterruptibly(); //取消正在同步运行的操作，来防止不正常操作长时间占用造成的阻塞
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
    }


}
